home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
valc204
/
valc204q
/
valc204q.bas
next >
Wrap
BASIC Source File
|
1993-07-08
|
28KB
|
1,176 lines
'*********************************** ※A:\VALCREC\VALCREC.DAT記録処理追加。
'* VALCALC.BAS Copyright A.OKUYAMA * FM-TOWNS 1H(6MB) 1992,11,22
'* 2~16進 整数四則演算器 * F-BASIC386CP V2.1 L10 → QuickBASIC V4.5
'* 1992, 1,23 Ver2.04 1993, 2,14 * ※グラフィック処理を削除しました。
'*********************************** ※マウス処理を削除しました。
MAIN: '*********************** 初期設定 ***************************
ON ERROR GOTO ERRLOOP
CLEAR
TYPE VALC
REC AS STRING * 255
DUM AS STRING * 1
END TYPE
DIM D#(254, 2), P$(254), CAL%(254), A$(254), NISHIN$(254)
DIM DUM$(254), MPARTS%(254), VALC AS VALC
'***** ファイル入出力環境設定 *****
DIR$ = "A:\VALCREC\"
FILE$ = "VALCREC.DAT"
FTYPE% = 4
RECLEN = LEN(VALC)
VALC.DUM = CHR$(13)
VALCREC% = 0
'**********************************
FOR C = 1 TO 31
IF C / 4 = INT(C / 4) THEN NISHIN$(C) = "_"
NEXT C
SCREEN 0
WIDTH 80, 25
EFFICIENCY$ = ".0000000000000000"
RECFILE: '***** 過去の計算記録ファイルを開く *****
COLOR 6, 0
CLS
LOCATE 13, 8
PRINT USING "《&&ドライブにデータ用フロッピーを挿入しボタンを押してください。》"; DIR$
RECFILE = 0
DRIVECK:
GOSUB PANEL
ON ERROR GOTO RECERR
I$ = INKEY$
IF I$ = "" THEN GOTO DRIVECK
EP = 1
GOSUB FOPEN
RECFILE = 1
CLOSE FONO%
ON ERROR GOTO 0
'**************************** スタート ****************************
START:
COLOR 0, 0
CLS 0
MEMOFLAG = 0
FW$ = I$
GOSUB PANEL '***** タイトル表示 *****
GOSUB COMMENT '***** コメント表示 *****
COLOR 6
LOCATE 3, 1
PRINT "前 回 =";
GOSUB MEMOPRT '***** 前回の式を表示する *****
COLOR 6
GOSUB OUTP '***** 前回の計算結果を表示する *****
COLOR 7
PRINT "計算式=";
IF S$ = "R" OR S$ = "r" THEN
S$ = ""
GOTO START2
END IF
GOSUB COMLCL '***** コマンド・ライン消去 *****
START2:
GOSUB COMLINE '***** コマンド・ライン入力 *****
GOSUB COMMCLS '***** コメント表示消去 *****
GOSUB STANDBY '***** 変数を初期化する *****
GOSUB DERIV '***** 数字と演算記号を抽出する *****
GOSUB CONV '***** 10進数に変換する *****
GOSUB CALC '***** 式計算ルーチン *****
GOSUB SUBPRT '***** 計算経過を表示する *****
GOSUB OUTP '***** 10・16・2進数計算結果表示 *****
GOSUB CONVOUT '***** 3~15進数計算結果表示 *****
COLOR 2
PRINT " 《 ESC・BREAK キーで終了します。R,rで前回復活。他のキーは新入力になります。》": COLOR 7
CSRX% = 0
CSRY% = CSRLIN - 1
STP:
S$ = INKEY$
GOSUB PANEL
IF S$ = "" THEN GOTO STP
IF S$ = "R" OR S$ = "r" THEN
MEMORY$ = FW$
GOSUB COMLCL
GOSUB APEND
GOTO START
END IF
IF S$ <> CHR$(27) THEN GOTO START
END
'********************************************************************
STANDBY: '***** 変数を初期化する *****
TOTAL# = 0
CLASS = 0
CLMAX = 0
PARTS = 0
FOR C = 0 TO 254
D#(C, 0) = 0
D#(C, 1) = 0
D#(C, 2) = 0
CAL%(C) = 0
P$(C) = ""
NEXT C
RETURN
PANEL: '***** 0行目タイトル表示 *****
ON ERROR GOTO ERRLOOP
LOCATE 1, 1
COLOR 4
PRINT " 赤色は実数エラー箇所 ";
COLOR 3
PRINT "水色は虚数エラー箇所 ";
COLOR 5
PRINT "紫色は警告箇所 ";
LOCATE 2, 1
COLOR 0, 6
PRINT USING " & & Ver2.04 "; DATE$;
COLOR 0, 2
PRINT " 2 ~ 16 進 整 数 四 則 演 算 器 ";
COLOR 0, 6
PRINT USING " A.Okuyama & & "; TIME$;
RETURN
COMMENT: '***** コメント表示 *****
LOCATE 13, 1
COLOR 2
PRINT "入力条件:各入力項が±1.797693134862315D+308以内。計算式の総桁数は255文字まで。"
COLOR 3
PRINT " 計算の都合上、10進数換算で小数点以下15桁未満を切り捨てます。"
PRINT " 各項の直後に@マークに続けて2~16進数を指定してください。"
PRINT " ただし、10進数の場合は省略できます。また16進数はH,hで代用できます。"
PRINT " なお、省略10進数以外の小数点は0と見なすので注意が必要です。"
PRINT " [{()}]*/+-^0123456789AaBbCcDdEeFf@HhGgLlMm[空白][ESC][削除][挿入]"
PRINT " [BACK-SKIP]←↑↓→[RETURN][実行]RrXxの各キーが使えます。"
COLOR 2
PRINT "出力条件:-4294967295 ≦ 出 力 項 ≦ 4294967295 (FFFFFFFFh)"
COLOR 3
PRINT " 10進数以外は10進小数点以下の値を切り捨てます。"
COLOR 2
PRINT "入力方法:前回の各項はG(g)、式はL(l)、解はM(m)キーでカーソル位置に挿入します。 "
COLOR 3
PRINT " (例) 計算式=-[-{FFH+fah*-10@16}-{56@7-12@4*(32-5*2)}/-40@6]-{42@7^5^(1/2)}";
RETURN
COMMCLS: '***** コメント表示消去 *****
CSRX% = POS(0)
CSRY% = CSRLIN
COLOR 7
FOR Y = 13 TO 24
LOCATE Y, 1
PRINT SPACE$(79);
NEXT Y
LOCATE CSRY%, CSRX%
RETURN
MEMOPRT: '********** 前回の式を表示する。**********
ON ERROR GOTO ERRLOOP
MEMOCSRX% = 9
MEMOCSRY% = 3
LOCATE MEMOCSRY%, MEMOCSRX%
FOR MC% = 0 TO PARTS
COLOR 6
IF CAL%(MC%) = 1 THEN PRINT "*";
IF CAL%(MC%) = 2 THEN PRINT "/";
IF CAL%(MC%) = 3 THEN PRINT "+";
IF CAL%(MC%) = 4 THEN PRINT "-";
IF CAL%(MC%) = 5 THEN PRINT "^";
IF CAL%(MC%) = 10 THEN PRINT "(";
IF CAL%(MC%) = -10 THEN PRINT ")";
IF D#(MC%, 2) <> 0 THEN COLOR 7 - D#(MC%, 2)
IF MC% = MPARTS%(MEMOCSX%) AND MEMOFLAG = 1 THEN
IF D#(MC%, 2) = 0 THEN
COLOR 0, 6
ELSE
COLOR 0, 7 - D#(MC%, 2)
END IF
END IF
PRINT P$(MC%);
NEXT MC%
PRINT
RETURN
'****************** コマンド・ライン入力ルーチン ********************
COMLCL:
ON ERROR GOTO ERRLOOP
FOR C% = 0 TO 254
DUM$(C%) = ""
NEXT C%
RETURN
COMLINE:
ON ERROR GOTO ERRLOOP
CSRX% = POS(0)
CSRY% = CSRLIN
CSX% = 0
CSY% = 0
GOSUB PACK
COLOR 0, 3
GOSUB CPRT
COLOR 7
INKEY: '********** 計算式入力ルーチン **********
GOSUB PANEL
ON ERROR GOTO ERRLOOP
K$ = INKEY$
IF K$ = "" THEN GOTO INKEY
IF (K$ = "R" OR K$ = "r") AND VALCREC% = 0 THEN
GOSUB PACK
GOSUB RECSET
COLOR 0, 3
GOSUB CPRT
GOTO INKEY
END IF
IF K$ = "G" OR K$ = "g" THEN
MEMOFLAG = 0
GOSUB MEMORY
MEMOFLAG = 1
MEMOCSX% = 0
GOSUB MEMOPRT
GOSUB MEMORY
PRINT
GOSUB PACK
GOSUB APEND
GOSUB PACK
COLOR 0, 3
GOSUB CPRT
COLOR 7
MEMOFLAG = 0
GOSUB MEMOPRT
GOTO INKEY
END IF
IF K$ = "L" OR K$ = "l" THEN
IF FW$ <> "" THEN
MEMORY$ = FW$
GOSUB PACK
GOSUB APEND
GOSUB PACK
COLOR 0, 3
GOSUB CPRT
COLOR 7
GOTO INKEY
END IF
END IF
IF K$ = "M" OR K$ = "m" THEN
IF ER = 0 THEN
GOSUB REPLY
GOSUB PACK
GOSUB APEND
GOSUB PACK
COLOR 0, 3
GOSUB CPRT
COLOR 7
GOTO INKEY
ELSE
GOTO INKEY
END IF
END IF
IF K$ = CHR$(0) + CHR$(77) THEN '→CHR$(28)
COLOR 7
GOSUB CPRT
GOSUB RIGHT
COLOR 0, 3
GOSUB CPRT
GOTO INKEY
END IF
IF K$ = CHR$(0) + CHR$(75) THEN '←CHR$(29)
COLOR 7
GOSUB CPRT
GOSUB LEFT
COLOR 0, 3
GOSUB CPRT
GOTO INKEY
END IF
IF K$ = CHR$(0) + CHR$(72) THEN '↑CHR$(30)
COLOR 7
GOSUB CPRT
GOSUB UP
COLOR 0, 3
GOSUB CPRT
GOTO INKEY
END IF
IF K$ = CHR$(0) + CHR$(80) THEN '↓CHR$(31)
COLOR 7
GOSUB CPRT
GOSUB DOWN
COLOR 0, 3
GOSUB CPRT
GOTO INKEY
END IF
IF K$ = CHR$(8) THEN 'BACK SPACE
GOSUB PACK
COLOR 0, 3
GOSUB CPRT
COLOR 7
GOTO INKEY
END IF
IF K$ = CHR$(13) THEN 'RETURN
GOSUB PACK
RETURN
END IF
IF K$ = CHR$(27) THEN END 'ESC
IF K$ = CHR$(0) + CHR$(82) THEN '挿入CHR$(18)
GOSUB INS
GOTO INKEY
END IF
IF K$ = CHR$(0) + CHR$(83) OR K$ = " " THEN '削除CHR$(&H7F)
GOSUB DEL
COLOR 0, 3
GOSUB CPRT
COLOR 7
GOTO INKEY
END IF
IF &H27 < ASC(K$) AND ASC(K$) < &H3A AND K$ <> "'" AND K$ <> "," THEN
DUM$(CSX%) = K$
COLOR 7
GOSUB CPRT
GOSUB RIGHT
COLOR 0, 3
GOSUB CPRT
GOTO INKEY
END IF
IF &H3F < ASC(K$) AND ASC(K$) < &H49 THEN
DUM$(CSX%) = K$
COLOR 7
GOSUB CPRT
GOSUB RIGHT
COLOR 0, 3
GOSUB CPRT
GOTO INKEY
END IF
IF &H60 < ASC(K$) AND ASC(K$) < &H69 THEN
DUM$(CSX%) = K$
COLOR 7
GOSUB CPRT
GOSUB RIGHT
COLOR 0, 3
GOSUB CPRT
GOTO INKEY
END IF
IF K$ = "[" OR K$ = "]" OR K$ = "^" OR K$ = "{" OR K$ = "}" THEN
DUM$(CSX%) = K$
COLOR 7
GOSUB CPRT
GOSUB RIGHT
COLOR 0, 3
GOSUB CPRT
GOTO INKEY
ELSE
GOTO INKEY
END IF
RIGHT: '***** カーソルを右へ移動する。 *****
IF CSX% < 254 THEN CSX% = CSX% + 1
RETURN
LEFT: '***** カーソルを左へ移動する。 *****
IF 0 < CSX% THEN CSX% = CSX% - 1
RETURN
UP: '***** カーソルを上へ移動する。 *****
IF 0 <= CSX% - 80 THEN CSX% = CSX% - 80
RETURN
DOWN: '***** カーソルを下へ移動する。 *****
IF CSX% + 80 <= 254 THEN CSX% = CSX% + 80
RETURN
CPRT: '***** カーソルを表示する。*****
ON ERROR GOTO ERRLOOP
CSY% = CSRY% + INT((CSRX% + CSX% - 1) / 80)
LOCATE CSY%, CSRX% + CSX% - INT((CSRX% + CSX% - 1) / 80) * 80
IF DUM$(CSX%) = "" THEN
PRINT " "
ELSE
PRINT DUM$(CSX%)
END IF
RETURN
PACK: '***** 計算式を文字詰めする。*****
ON ERROR GOTO ERRLOOP
I$ = ""
CSC% = 0 '***** CSC%=LEN(I$)
FOR C% = 1 TO 255
I$ = I$ + DUM$(C% - 1)
IF DUM$(C% - 1) <> "" THEN
CSC% = CSC% + 1
DUM$(C% - 1) = ""
END IF
IF C% = CSX% AND 0 < CSX% THEN CSX% = CSC%
IF CSX% < 0 THEN CSX% = 0
NEXT C%
FOR C% = 1 TO LEN(I$)
DUM$(C% - 1) = MID$(I$, C%, 1)
NEXT C%
LOCATE CSRY%, CSRX%
COLOR 7
FOR C% = 1 TO 255
PRINT " ";
NEXT C%
LOCATE CSRY%, CSRX%
COLOR 7
IF LEN(I$) = 0 THEN GOTO PACKJP
FOR C% = 1 TO LEN(I$)
PRINT MID$(I$, C%, 1);
NEXT C%
PACKJP:
PRINT
RETURN
APEND: '***** 選択したMEMORY$を計算式のカーソル位置に挿入する。*****
ON ERROR GOTO ERRLOOP
SUBI$ = ""
IF CSX% = 0 THEN GOTO APJP1
FOR MC% = 0 TO CSX% - 1
SUBI$ = SUBI$ + DUM$(MC%)
NEXT MC%
APJP1:
IF LEN(SUBI$) = 255 THEN GOTO APJP2
SUBI$ = SUBI$ + LEFT$(MEMORY$, 255 - LEN(SUBI$))
FOR MC% = CSX% TO 254
IF LEN(SUBI$) + LEN(DUM$(MC%)) <= 255 THEN SUBI$ = SUBI$ + DUM$(MC%)
NEXT MC%
APJP2:
IF LEN(SUBI$) = 0 THEN RETURN
FOR MC% = 1 TO LEN(SUBI$)
DUM$(MC% - 1) = MID$(SUBI$, MC%, 1)
NEXT MC%
RETURN
DEL: '***** 計算式のカーソル位置の1文字を削除する。*****
ON ERROR GOTO ERRLOOP
DUM$(CSX%) = ""
COLOR 7
GOSUB CPRT
GOSUB RIGHT
IF K$ = " " THEN RETURN '***** K$が空白ならば文字詰めしない。
GOSUB PACK
RETURN
INS: '***** 計算式のカーソル位置に空白を挿入する。*****
ON ERROR GOTO ERRLOOP
IF CSX% = 254 THEN GOTO INSJP
FOR C% = 254 TO CSX% + 1 STEP -1
DUM$(C%) = DUM$(C% - 1)
NEXT C%
INSJP:
DUM$(CSX%) = ""
COLOR 7
LOCATE CSRY%, CSRX%
FOR C% = 1 TO 255
IF DUM$(C% - 1) = "" THEN
PRINT " ";
ELSE
PRINT DUM$(C% - 1);
END IF
NEXT C%
COLOR 0, 3
GOSUB CPRT
COLOR 7
RETURN
RECSET: '********** DIR$ + FILE$ に記録した式を読み出す **********
ON ERROR GOTO 0
IF RECFILE = 0 THEN RETURN
NEWREC$ = I$
GOSUB FOPEN
IF DNOMAX < 4000 THEN
DNO = DNOMAX + 1
ELSE
DNO = DNOMAX
END IF
IF DNOMAX = 0 THEN GOTO RECRW
RECLOOP: '***** 選択処理 *****
IF DNO <= DNOMAX THEN
GET FONO%, DNO, VALC
ELSE
VALC.REC = NEWREC$
END IF
READREC$ = ""
RECP$ = ""
FOR COLUM = 1 TO 255
RECP$ = MID$(VALC.REC, COLUM, 1)
IF RECP$ <> " " THEN READREC$ = READREC$ + RECP$
NEXT COLUM
COLOR 7
LOCATE CSRY%, 1
PRINT USING "録####="; DNO;
COLOR 0, 3
IF LEN(READREC$) = 0 THEN GOTO RECPRT1
FOR C% = 1 TO LEN(READREC$)
PRINT MID$(READREC$, C%, 1);
NEXT C%
RECPRT1:
COLOR 7
IF 255 <= C% THEN GOTO RECPRTJP
FOR CC% = C% TO 255
PRINT " ";
NEXT CC%
RECPRTJP:
RECINK: '***** 選択入力 *****
GOSUB PANEL
I$ = INKEY$
IF I$ = "" THEN GOTO RECINK
IF I$ = CHR$(0) + CHR$(75) OR I$ = CHR$(0) + CHR$(72) THEN DNO = DNO - 1 '←↑
IF I$ = CHR$(0) + CHR$(77) OR I$ = CHR$(0) + CHR$(80) THEN DNO = DNO + 1 '→↓
IF I$ = CHR$(0) + CHR$(82) OR I$ = CHR$(27) THEN GOTO EORECSET
IF (I$ = "X" OR I$ = "x") AND NEWREC$ <> "" THEN GOSUB RECXCHG
IF I$ = CHR$(13) THEN GOTO RECRW
IF DNO < 1 THEN DNO = DNOMAX + 1
IF DNOMAX + 1 < DNO THEN DNO = 1
GOTO RECLOOP
RECRW: '***** DIR$ + FILE$ 書き込み *****
IF DNOMAX < DNO AND 0 < LEN(NEWREC$) THEN
VALC.REC = NEWREC$
I$ = NEWREC$
PUT FONO%, DNO, VALC
END IF
IF DNO <= DNOMAX THEN
VALC.REC = READREC$
I$ = READREC$
END IF
FOR C% = 1 TO 255
DUM$(C% - 1) = MID$(I$, C%, 1)
NEXT C%
EORECSET: '***** 選択処理終了 *****
COLOR 7
LOCATE CSRY%, 1
PRINT "計算式=";
CLOSE FONO%
GOSUB PACK
RETURN
RECXCHG: '***** 記録データの入替え *****
IF DNOMAX < DNO THEN
VALC.REC = READREC$
ELSE
VALC.REC = NEWREC$
END IF
DNOMAX = DNO - 1
RETURN
'********************* 前回メモリー選択ルーチン *********************
REPLY: '***** 前回の解を指定するメモリー処理(指数表記を改める)*****
MEMORY$ = ""
FOR C% = 1 TO LEN(STR$(TOTAL#))
DUM$ = MID$(STR$(TOTAL#), C%, 1)
IF DUM$ = "D" THEN
MEMORY$ = "(" + MEMORY$ + "*10^(" + RIGHT$(STR$(TOTAL#), 4) + "))"
C% = LEN(STR$(TOTAL#))
GOTO REPLYJP
END IF
MEMORY$ = MEMORY$ + DUM$
REPLYJP:
NEXT C%
RETURN
MEMORY: '***** 前回の項を指定するメモリー処理 *****
ON ERROR GOTO ERRLOOP
MEMOCSX% = 0
MEMOPARTS% = 0
FOR MC% = 0 TO PARTS
IF P$(MC%) <> "" THEN
MPARTS%(MEMOPARTS%) = MC%
MEMOPARTS% = MEMOPARTS% + 1
END IF
IF MEMOFLAG = 0 AND MEMOCSX% = 0 AND P$(MC%) <> "" THEN
MEMOCSX% = MC%
END IF
NEXT MC%
MEMORY$ = P$(MPARTS%(MEMOCSX%))
IF MEMOPARTS% = 0 OR MEMOFLAG = 0 THEN RETURN
MEMOINKEY: '***** 前回の式の項を指定する。*****
ON ERROR GOTO ERRLOOP
GOSUB PANEL
MEM$ = INKEY$
IF MEM$ = "" THEN GOTO MEMOINKEY
IF MEM$ = CHR$(0) + CHR$(77) THEN
GOSUB MEMORIGHT
GOSUB MEMOPRT
GOTO MEMOINKEY
END IF
IF MEM$ = CHR$(0) + CHR$(75) THEN
GOSUB MEMOLEFT
GOSUB MEMOPRT
GOTO MEMOINKEY
END IF
IF MEM$ = CHR$(0) + CHR$(82) OR MEM$ = CHR$(27) THEN
MEMORY$ = ""
PRINT
RETURN
END IF
IF MEM$ = CHR$(13) THEN
GOSUB MEMOPRT
RETURN
END IF
GOTO MEMOINKEY
MEMORIGHT: '***** 前回の式の中で、現在の指定よりも一つ右の項 *****
ON ERROR GOTO ERRLOOP
IF MEMOCSX% < MEMOPARTS% - 1 THEN
MEMOCSX% = MEMOCSX% + 1
MEMORY$ = P$(MPARTS%(MEMOCSX%))
END IF
RETURN
MEMOLEFT: '***** 前回の式の中で、現在の指定よりも一つ左の項 *****
ON ERROR GOTO ERRLOOP
IF 0 < MEMOCSX% THEN
MEMOCSX% = MEMOCSX% - 1
MEMORY$ = P$(MPARTS%(MEMOCSX%))
END IF
RETURN
'************************* 式評価ルーチン ***************************
'***** 数字("P$(PARTS)")と演算記号("CAL%(PARTS)")を抽出する。*****
DERIV:
ON ERROR GOTO ERRLOOP
FOR X = 1 TO LEN(I$)
A$ = MID$(I$, X, 1)
IF A$ = "(" OR A$ = "[" OR A$ = "{" THEN
PARTS = PARTS + 1
CLASS = CLASS + 1
CAL%(PARTS) = 10
CLMAX = CLMAX + 1
GOTO DVJP1
END IF
IF A$ = ")" OR A$ = "]" OR A$ = "}" THEN
PARTS = PARTS + 1
CLASS = CLASS - 1
CAL%(PARTS) = -10
GOTO DVJP1
END IF
IF A$ = "*" THEN
PARTS = PARTS + 1
CAL%(PARTS) = 1
GOTO DVJP1
END IF
IF A$ = "/" THEN
PARTS = PARTS + 1
CAL%(PARTS) = 2
GOTO DVJP1
END IF
IF A$ = "+" THEN
IF P$(PARTS) = "" AND CAL%(PARTS) <> -10 THEN
P$(PARTS) = "1"
PARTS = PARTS + 1
CAL%(PARTS) = 1 + (CAL%(PARTS - 1) = 3)
TEMPCAL% = CAL%(PARTS - 1) - INT(CAL%(PARTS - 1) / 10) * 10
CAL%(PARTS) = CAL%(PARTS) + INT(TEMPCAL% / 2) * (CAL%(PARTS - 1) AND 2) / 2
GOTO DVJP1
ELSE
PARTS = PARTS + 1
CAL%(PARTS) = 3
GOTO DVJP1
END IF
END IF
IF A$ = "-" THEN
IF P$(PARTS) = "" AND CAL%(PARTS) <> -10 THEN
P$(PARTS) = "-1"
PARTS = PARTS + 1
CAL%(PARTS) = 1 + (CAL%(PARTS - 1) = 3)
TEMPCAL% = CAL%(PARTS - 1) - INT(CAL%(PARTS - 1) / 10) * 10
CAL%(PARTS) = CAL%(PARTS) + INT(TEMPCAL% / 2) * (CAL%(PARTS - 1) AND 2) / 2
GOTO DVJP1
ELSE
PARTS = PARTS + 1
CAL%(PARTS) = 4
GOTO DVJP1
END IF
END IF
IF A$ = "^" THEN
PARTS = PARTS + 1
CAL%(PARTS) = 5
GOTO DVJP1
END IF
P$(PARTS) = P$(PARTS) + A$
DVJP1:
NEXT X
RETURN
'***** 数字("P$(COUNT)")を10進数("D#(COUNT,0)")に変換する。******
CONV:
ON ERROR GOTO ERRLOOP
ER = 0
FOR COUNT = 0 TO PARTS
P$ = ""
FOR X = 1 TO LEN(P$(COUNT))
A$ = MID$(P$(COUNT), X, 1)
IF A$ = "@" THEN
SHIN# = VAL(RIGHT$(P$(COUNT), LEN(P$(COUNT)) - X))
GOTO HENKAN
END IF
IF A$ = "H" OR A$ = "h" THEN
SHIN# = 16
GOTO HENKAN
END IF
P$ = P$ + A$
NEXT X
IF VAL(P$) = INT(VAL(P$)) THEN
P$ = P$ + LEFT$(EFFICIENCY$, 255 - LEN(P$))
ELSE
P$ = P$ + MID$(EFFICIENCY$, 2, 255 - LEN(P$))
END IF
D#(COUNT, 0) = VAL(P$)
GOTO DERIVJP2
HENKAN:
A# = 0
IF P$ = "" THEN
D#(COUNT, 2) = 3
ER = 1
GOTO ERJP
END IF
FOR C = 0 TO X - 2
A$(C) = MID$(P$, C + 1, 1) + EFFICIENCY$
ATEMP# = ASC(A$(C))
A# = A# + SHIN# ^ (X - C - 2) * (VAL(A$(C)) + INT(ATEMP# / 65) * (ATEMP# - 55) * ABS(INT(ATEMP# / 71) - 1) + INT(ATEMP# / 97) * (ATEMP# - 87)) * ABS(INT(ATEMP# / 103) - 1)
IF SHIN# <= (VAL(A$(C)) + INT(ATEMP# / 65) * (ATEMP# - 55) * ABS(INT(ATEMP# / 71) - 1) + INT(ATEMP# / 97) * (ATEMP# - 87)) * ABS(INT(ATEMP# / 103) - 1) THEN
D#(COUNT, 2) = 3
ER = 1
END IF
NEXT C
ERJP:
D#(COUNT, 0) = A#
DERIVJP2:
NEXT COUNT
PRINT " =";
FOR C = 0 TO PARTS
IF CAL%(C) = 1 THEN PRINT "*";
IF CAL%(C) = 2 THEN PRINT "/";
IF CAL%(C) = 3 THEN PRINT "+";
IF CAL%(C) = 4 THEN PRINT "-";
IF CAL%(C) = 5 THEN PRINT "^";
IF CAL%(C) = 10 THEN PRINT "(";
IF CAL%(C) = -10 THEN PRINT ")";
COLOR 7 - D#(C, 2)
PRINT P$(C);
COLOR 7
NEXT C
PRINT
RETURN
'************************** 演算ルーチン ****************************
CIRCUM: '***** 各項のべき乗の連なりをチェックし、演算する。 *****
ON ERROR GOTO ERRLOOP
SSUBTOTAL# = D#(C, 0)
CC = C
CKCIRC = 0
ENDCIRC = C
IF FLAGOFF - 1 <= C THEN
D#(C, 1) = 1
RETURN
END IF
CIRCUM1:
CC = CC + 1
IF CC = FLAGOFF THEN GOTO CIRCUM2
IF D#(CC, 1) = 1 THEN GOTO CIRCUM1 '***** 計算済みの項を読み飛ばす *****
IF CAL%(CC) = 5 THEN
CKCIRC = CKCIRC + 1
ENDCIRC = CC
GOTO CIRCUM1
END IF
CIRCUM2:
IF CKCIRC = 0 THEN '***** べき乗が連なっていない *****
D#(C, 1) = 1
RETURN
END IF
SSUBTOTAL# = D#(ENDCIRC, 0)
D#(ENDCIRC, 1) = 1
CKCIRC = ENDCIRC
CIRCERR = 0
FOR CIRC = ENDCIRC - 1 TO C STEP -1
ON ERROR GOTO ERRLOOP
SSSUBTOTAL# = SSUBTOTAL#
IF D#(CIRC, 1) = 1 THEN GOTO CIRCUM4 '***** 計算済みの項を読み飛ばす *****
IF D#(CIRC, 0) = 1 THEN
SSUBTOTAL# = 1
CIRCERR = 0
GOTO CIRCUM3
END IF
IF D#(CIRC, 0) = 0 THEN
IF SSUBTOTAL# < 0 THEN
CIRCERR = 0
ELSE
SSUBTOTAL# = 0
D#(CIRC, 1) = 1
CIRCERR = 0
GOTO CIRCUM3
END IF
END IF
IF CIRCERR = 1 THEN
D#(CIRC, 1) = 1
D#(CIRC, 2) = 3
ER = 1
GOTO CIRCUM3
END IF
'***** 最大値を越える計算エラーを予防する *****
IF LOG(1.79769313486231D+308) < ABS(SSUBTOTAL#) * LOG(ABS(D#(CIRC, 0))) THEN
COLOR 4
PRINT SPC(15); "《 べき乗数値が大きすぎます! 修正してください。》"
D#(CKCIRC, 1) = 1
D#(CKCIRC, 2) = 3
ER = 1
CIRCERR = 0
COLOR 7
GOTO CIRCUM3
END IF
ON ERROR GOTO ERRLOOP '***** 計算する *****
SSUBTOTAL# = D#(CIRC, 0) ^ SSUBTOTAL#
D#(CIRC, 1) = 1
CKCIRC = CKCIRC + 1
CIRCUM3:
IF D#(CIRC, 0) = 1 THEN
CKCIRC = 0
ELSE
CKCIRC = CIRC
END IF
CIRCUM4:
NEXT CIRC
RETURN
CALC: '***** 式計算ルーチン *****
FOR COUNT = 0 TO CLMAX
IF COUNT = CLMAX THEN
FLAGON = 0
FLAGOFF = PARTS + 1
GOTO CALCJP2
END IF
FOR C = 0 TO PARTS
IF D#(C, 1) = 1 THEN GOTO CALCJP1
IF CAL%(C) = 10 THEN FLAGON = C
IF CAL%(C) = -10 AND FLAGON <> 0 THEN
FLAGOFF = C
GOTO CALCJP2
END IF
CALCJP1:
NEXT C
CALCJP2:
TOTAL# = 0
C = FLAGON
GOSUB CIRCUM
SUBTOTAL# = SSUBTOTAL#
FOR C = FLAGON + 1 TO FLAGOFF - 1
ON ERROR GOTO ERRLOOP
IF D#(C, 1) = 1 THEN GOTO CALCJP3
GOSUB CIRCUM
IF CAL%(C) = 1 THEN SUBTOTAL# = SUBTOTAL# * SSUBTOTAL#
IF CAL%(C) = 2 THEN
IF SSUBTOTAL# = 0 THEN
D#(C, 1) = 1
D#(C, 2) = 3
ER = 1
ELSE
SUBTOTAL# = SUBTOTAL# / SSUBTOTAL#
END IF
END IF
IF CAL%(C) = 3 THEN
TOTAL# = TOTAL# + SUBTOTAL#
SUBTOTAL# = SSUBTOTAL#
END IF
IF CAL%(C) = 4 THEN
TOTAL# = TOTAL# + SUBTOTAL#
SUBTOTAL# = -SSUBTOTAL#
END IF
C = ENDCIRC
CALCJP3:
NEXT C
TOTAL# = TOTAL# + SUBTOTAL#
IF -10 ^ -15 < TOTAL# AND TOTAL# < 10 ^ -15 THEN TOTAL# = 0
IF COUNT = CLMAX THEN GOTO CALCJP4
D#(FLAGON - 1, 0) = TOTAL#
D#(FLAGON, 1) = 1
D#(FLAGOFF, 1) = 1
CALCJP4:
NEXT COUNT
' PRINT FLAGON;FLAGOFF '************ CHECK *************
' FOR C=0 TO PARTS
' PRINT USING"###";C;
' PRINT USING "###### "; CAL%(C);
' PRINT USING "& &"; P$(C);
' PRINT USING "######"; D#(C, 0);
' PRINT USING "######"; D#(C, 1);
' PRINT USING "######"; D#(C, 2)
' NEXT C '**********************************************
RETURN
'********************** 計算結果表示ルーチン ************************
SUBPRT: '***** 計算経過出力 *****
ON ERROR GOTO ERRLOOP
PRINT " =";
FOR C = 0 TO PARTS
IF CAL%(C) = 1 THEN PRINT "*";
IF CAL%(C) = 2 THEN PRINT "/";
IF CAL%(C) = 3 THEN PRINT "+";
IF CAL%(C) = 4 THEN PRINT "-";
IF CAL%(C) = 5 THEN PRINT "^";
IF CAL%(C) = 10 THEN PRINT "[";
IF CAL%(C) = -10 THEN PRINT "]";
IF CAL%(C) <> -10 THEN
COLOR 7 - D#(C, 2)
PRINT D#(C, 0);
END IF
COLOR 7
NEXT C
PRINT
RETURN
OUTP: '***** 計算結果出力 *****
ON ERROR GOTO ERRLOOP
PRINT " =";
IF ER <> 0 THEN
COLOR 4
PRINT "ERROR"
COLOR 7
GOTO OPJP
END IF
PRINT TOTAL#
STOTAL# = TOTAL#
IF ABS(TOTAL#) > 4294967295# OR TOTAL# <> INT(TOTAL#) THEN
IF TOTAL# < 0 THEN
PRINT " < ";
ELSE
PRINT " > ";
END IF
ELSE
PRINT " = ";
END IF
IF TOTAL# < 0 THEN
PRINT "- ";
ELSE
PRINT " ";
END IF
IF ABS(STOTAL#) > 4294967295# THEN STOTAL# = 4294967295#
SHIN# = 16
CHSTART:
CONVOUT$ = ""
A# = ABS(STOTAL#)
C# = 8
DCK = 0
HSHIN:
IF C# < 0 THEN GOTO HSHINOUT
SUBA# = INT(A# / SHIN# ^ C#)
IF 0 < SUBA# AND DCK = 0 THEN DCK = 1
IF 9 < SUBA# THEN
CONVOUT$ = CONVOUT$ + CHR$(&H41 + SUBA# - 10)
ELSE
IF DCK = 1 THEN
CONVOUT$ = CONVOUT$ + RIGHT$(STR$(SUBA#), 1)
ELSE
CONVOUT$ = CONVOUT$ + "0"
END IF
END IF
A# = A# - INT(A# / SHIN# ^ C#) * SHIN# ^ C#
C# = C# - 1
GOTO HSHIN
HSHINOUT:
PRINT RIGHT$("00000000" + CONVOUT$, 8); " h";
PRINT " = ";
A# = ABS(STOTAL#)
C# = 31
IF TOTAL# < 0 THEN
PRINT "- ";
ELSE
PRINT " ";
END IF
NISHIN:
IF C# < 0 THEN
PRINT "( 2)"
GOTO OPJP
ELSE
PRINT USING "#"; INT(A# / 2 ^ C#);
PRINT NISHIN$(C#);
A# = A# - INT(A# / 2 ^ C#) * 2 ^ C#
C# = C# - 1
GOTO NISHIN
END IF
OPJP:
COLOR 5
IF CLASS < 0 THEN
PRINT "〔(〕が"; -CLASS; "個足りません。"
ELSE
IF CLASS > 0 THEN PRINT "〔)〕が"; CLASS; "個足りません。"
END IF
RETURN
CONVOUT: '***** 3~15進数計算結果出力 *****
IF ER <> 0 THEN RETURN
CSRX% = POS(0)
CSRY% = CSRLIN
COLOR 6
PRINT " 《 計算結果を他の進数で表示しますか。【 YES→実行・NO→取消 】》"
IF 22 < CSRY% THEN CSRY% = 22
SCVO:
S$ = INKEY$
GOSUB PANEL
IF S$ = "" THEN GOTO SCVO
IF S$ = "N" OR S$ = "n" OR S$ = CHR$(24) OR S$ = CHR$(27) THEN
LOCATE CSRY%, CSRX%
COLOR 7
PRINT SPACE$(80);
LOCATE CSRY%, CSRX%
RETURN
END IF
IF S$ = "Y" OR S$ = "y" OR S$ = CHR$(13) THEN
LOCATE CSRY%, CSRX%
COLOR 7
PRINT SPACE$(80);
LOCATE CSRY%, CSRX%
ELSE
GOTO SCVO
END IF
SHIN# = 3
CVOSTART:
CONVOUT$ = ""
A# = ABS(STOTAL#)
C# = 20
DCK = 0
COLOR 7
PRINT " = ";
TASHIN:
IF C# < 0 THEN GOTO CVOJP
SUBA# = INT(A# / SHIN# ^ C#)
IF 0 < SUBA# AND DCK = 0 THEN
DCK = 1
IF TOTAL# < 0 THEN
CONVOUT$ = CONVOUT$ + "-"
ELSE
CONVOUT$ = CONVOUT$ + " "
END IF
END IF
IF 9 < SUBA# THEN
CONVOUT$ = CONVOUT$ + CHR$(&H41 + SUBA# - 10)
ELSE
IF DCK = 1 THEN
CONVOUT$ = CONVOUT$ + RIGHT$(STR$(SUBA#), 1)
ELSE
CONVOUT$ = CONVOUT$ + " "
END IF
END IF
A# = A# - INT(A# / SHIN# ^ C#) * SHIN# ^ C#
C# = C# - 1
GOTO TASHIN
CVOJP:
IF DCK = 0 THEN CONVOUT$ = " 0"
PRINT CONVOUT$;
IF SHIN# = INT(SHIN# / 2) * 2 THEN
PRINT USING "(##)"; SHIN#
ELSE
PRINT USING "(##)"; SHIN#;
END IF
SHIN# = SHIN# + 1
IF SHIN# < 16 THEN GOTO CVOSTART
PRINT
RETURN
'*********************** エラー処理ルーチン *************************
ERRLOOP:
IF ERR = 6 THEN
COLOR 4
PRINT SPC(18); "《 数値が大きすぎます! 修正してください。》"
ELSE
GOTO EJP1
END IF
D#(CIRC, 2) = 3
ER = 1
CIRCERR = 1
COLOR 7
'GOSUB SUBPRT
RESUME NEXT
EJP1:
IF ERR = 5 THEN
COLOR 3
PRINT SPC(20); "《 虚数を含みます! 修正してください。》"
ELSE
GOTO EJP2
END IF
D#(CIRC, 1) = 1
D#(CIRC, 2) = 4
ER = 1
CIRCERR = 1
COLOR 7
'GOSUB SUBPRT
RESUME CIRCUM3
EJP2:
PRINT
COLOR 4
PRINT SPC(20); "《 対応できないエラーです。ごめんなさい。》"
PRINT SPC(29); "line"; ERL; " error no."; ERR
ESTOP2:
E$ = INKEY$
IF E$ = "" THEN GOTO ESTOP2
RESUME MAIN
RECERR: '***************************
IF EP = 1 THEN GOTO RECPASS
IF EP = 2 THEN RESUME NEXT
FOPEN: '***** ファイルオープンユニット ************
'I DIR$ : ディレクトリ 例 A:\DIR\DIR\ ※[\]必須
'I FILE$ : ファイル名
'I FTYPE% : ファイルオープンタイプ(I=1, O=2, R=4, A=8, B=32, ELSE END SUB)
'I RECLEN : レコード長(デフォルトは (S)512Byte, (R)128Byte。(B)不用)
'O FONO% : ファイルオープン番号(自動発生)
'O DNOMAX : RANDOMオープン時のデータ記録数
'O EP% : エラーポイント
'O EP$ : エラーメッセージ
'**************** ユニット内ラベル ****************
'FOPEN: : ファイルオープンユニット・メインラベル
'ERRFMAKE: : ルート・ディレクトリ設定
'ERRFCK: : ディレクトリ検査・作成
'ERRFOUT: : ファイル作成・オープン
'ERRFOPEN: : エラー処理ルーチン
'EOFOPEN: : ユニット終了
'**************************************************
FONO% = FREEFILE
DNOMAX = 0
EP$ = ""
EP% = 1
ON ERROR GOTO ERRFOPEN
SELECT CASE FTYPE%
CASE 1
IF RECLEN < 1 OR 32767 < RECLEN THEN RECLEN = 512
OPEN DIR$ + FILE$ FOR INPUT AS FONO% LEN = RECLEN
CASE 2
IF RECLEN < 1 OR 32767 < RECLEN THEN RECLEN = 512
OPEN DIR$ + FILE$ FOR OUTPUT AS FONO% LEN = RECLEN
CASE 4
IF RECLEN = 0 OR 32767 < RECLEN THEN RECLEN = 128
OPEN DIR$ + FILE$ FOR RANDOM AS FONO% LEN = RECLEN
DNOMAX = LOF(FONO%) \ RECLEN
CASE 8
IF RECLEN = 0 OR 32767 < RECLEN THEN RECLEN = 512
OPEN DIR$ + FILE$ FOR APPEND AS FONO% LEN = RECLEN
CASE 32
OPEN DIR$ + FILE$ FOR BINARY AS FONO%
END SELECT
EP% = 0
GOTO EOFOPEN
ERRFMAKE:
SHELL LEFT$(DIR$, 2)
' ***** 拡張 *****
IF RIGHT$(EP$, 2) = "71" THEN
RECPASS:
COLOR 3
LOCATE 13, 3
PRINT "《Aドライブのデータフロッピーが不備です。計算式の記録・再生は行いません。》";
VALCREC% = 1
C = 0
RECPASSL:
IF 500 < C THEN GOTO START
GOSUB PANEL
I$ = INKEY$
C = C + 1
IF I$ <> "" THEN C = 500
GOTO RECPASSL
END IF
CHDIR "\"
DIRPTR% = 4
ERRFCK:
EP% = 2
ON ERROR GOTO ERRFOPEN
IF INSTR(DIRPTR%, DIR$, "\") = 0 THEN GOTO ERRFOUT
MKDIR LEFT$(DIR$, INSTR(DIRPTR%, DIR$, "\") - 1)
DIRPTR% = INSTR(DIRPTR%, DIR$, "\") + 1
GOTO ERRFCK
ERRFOUT:
EP% = 0
SELECT CASE FTYPE%
CASE 2
IF RECLEN < 1 OR 32767 < RECLEN THEN RECLEN = 512
OPEN DIR$ + FILE$ FOR OUTPUT AS FONO% LEN = RECLEN
CASE 4
IF RECLEN = 0 OR 32767 < RECLEN THEN RECLEN = 128
OPEN DIR$ + FILE$ FOR RANDOM AS FONO% LEN = RECLEN
DNOMAX = LOF(FONO%) \ RECLEN
CASE 8
IF RECLEN = 0 OR 32767 < RECLEN THEN RECLEN = 512
OPEN DIR$ + FILE$ FOR OUTPUT AS FONO% LEN = RECLEN
CASE 32
OPEN DIR$ + FILE$ FOR BINARY AS FONO%
END SELECT
GOTO EOFOPEN
ERRFOPEN:
SELECT CASE EP%
CASE 1
EP$ = "指定のファイルが見つかりませんでした。" + STR$(ERR)
RESUME ERRFMAKE
CASE 2
EP$ = "指定のファイルがオープンできませんでした。"
RESUME RECPASS
CASE ELSE
EP$ = "予測していなかったFOPENエラーです。"
PRINT
PRINT EP$
RESUME RECPASS
END SELECT
EOFOPEN:
ON ERROR GOTO 0
RETURN
'**************************************************